# 函数中的参数类型

# 普通参数
# 就是位置参数，也叫做顺序参数，也是必须传递的参数
# 即定义的时候有几个参数，那么调用的时候就要传几个，并且顺序与定义时一致，否则会报错
def fun1(x, y):
    print(x, y)
# fun1(1, 2)


# 默认参数
# 比如要求三个参数 x, y, i 至少要传递两个
# 那么这时最后一个参数就是默认参数，但是默认参数，需要在定义行参时，指定默认值
def fun2(x, y, i=100):
    print(x, y, i)
# 调用时传递了默认的参数，那么里面使用的就是传递的实参
# fun2(1,2,3)
# 调用时如果没有传递默计参数，那么就会使用默认值
# fun2(1,2)


# 收集参数
# 定义一个行参，专门收集多余的实参 或者理解为，不确定需要传递多少个实参，直接用一个行参来接收
# 在定义函数时，如果需要收集参数，那么这个行参前面需要加一个*号 例如*args
# 接收的多余参数会接收在收集参数中，形成一个元组 *str
def fun3(x='+', *nums):
    print(type(nums)) # tuple
    if x == '+':
        print('加法运算')
    else:
        print('减法运算')
# fun3('-', 100, 200, 300)


# 命名关键字参数
'''
1, 定义在收集参数的后面
2, 关键字参数必须通过形参的名字来进行传递
3, 在调用时，必须按照行参的名字进行参数的传递
'''
def fun4(a, b, c=3, *args, name):
    print(a, b, c, args, name)
# fun4(1, 2, 3, 4, 5, 6, 7, name='hello') # 1 2 3 (4, 5, 6, 7) hello


# 关键字收集参数
def fun5(a, b, c=3, *args, name, **kwargs):
    print(a, b, c)
    print(args) # 普通收集参数，会把多余参数收集为一个元组
    print(name)
    print(kwargs) # 关键字参数收集，会把多余的关键字参数收集为一个字典

# fun5(1, 2, 4, 5, 6, 7, 9, name='jack', age='18', job='writer')
'''
1 2 4
(5, 6, 7, 9)
jack
{'age': '18', 'job': 'writer'}
'''
